/*
    实现一个uuid生成函数
*/

#include <iostream>
#include <sstream>
#include <random>
#include <iomanip>
#include <atomic>

std::string uuid()
{
    // 思想：8个0~255的整数 + 8字节的字节序构成16字节的数据
    //       然后将其转换为16进制格式的字符串，就形成了32个16进制格式的字符串
    //       字符串采用8-4-4-4-12格式分割

    std::random_device rd; // 非确定性随机数生成器（机器随机数生成器）
    std::mt19937 gen(rd()); // 伪随机数生成器，梅森旋转算法
    std::uniform_int_distribution<int> distribution(0, 255);
    std::stringstream ss;
    for(int i = 0; i < 8; i++) // 生成8个0~255的整数，并转换为16进制格式字符串
    {
        ss << std::hex << std::setw(2) << std::setfill('0') << distribution(gen);
        if(i == 3 || i == 5 || i == 7) 
            ss << "-";
    }
    static std::atomic<size_t> seq(0);
    size_t num = seq.fetch_add(1);
    for(int i = 7; i >= 0; i--)
    {
        ss << std::hex << std::setw(2) << std::setfill('0') << ((num >> (i * 8)) & 0xff);
        if(i == 6)
            ss << "-";
    }
    return ss.str();
}

int main()
{
    for(int i = 0; i < 20; i++)
    {
        std::cout << uuid() << std::endl;
    }
    return 0;
}